//beräknar längden på en C-sträng

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
int len_str( const char *ch)
    {
    int len = 0;
    if(! ch)
        return 0;
 
    while(*ch++)   // while(ch[len])
          len++;   //       len++;
    return len;
    }
 
int length (const char * String) {
  int Len = 0;
 
  if ( ! String ) {
         // ingen sträng givet
         return 0;
  }
  
  while ( String[Len] != '\0' ) {
         Len++;
      }
 
  return Len;
}
 
void main () {
  dos_console();
  char * s1 = "Detta är en sträng!";
  char * s2 = "Fyra";
  char s3[] = "Denna texten är ganska så lång men det gör ingenting";
  PR(s1); 
  PR(length(s1));
  PR(s2);
  PR(len_str(s2));
  PR(s3); PR(len_str(s3));
  cout << endl;
  //   strlen
  PR(strlen(s3)); //strlen färdig funktion
 
 
}

 

//demonstrerar buffrad output med cout

#include <iostream>
#include <unistd.h>
#include "iodos.h"
using namespace std;
 
int main () {
 
  // ingen flush, kommer att fastna i buffer
  cout << "Väntar...";
  sleep (3);
 
  // töm buffrar med 'flush'
  cout << "Väntar..." << flush;
  sleep (3);
 
  // implicit ömning via 'endl'
  cout << "Väntar..." << endl;
  sleep (3);
}
 
 
 
 

//bättre version av dynamisk vektorklass

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
 
class Vector {
public:
  // konstruktor och destruktor
  Vector (unsigned int Size) { m_Data = new int [Size]; m_Size = Size; }
  ~Vector () { delete [] m_Data; }
  
  // accessmetoder
  void set (unsigned int Index, int Value) { m_Data[Index] = Value; }
  int get (unsigned int Index) const { return m_Data[Index]; }
 
  // storleken på vektorn
  unsigned int size () const { return m_Size; }
 
private:
  // pekare till datablock
  int * m_Data;
 
  // storlek på vektor
  unsigned int m_Size;
};
 
  
void main () {
 
  // skapa en dynamisk vektor med 10 element
  Vector v( 10 );
 
  // fyll den ena med data
  for ( int Index = 0; Index < v.size(); Index++ ) 
         v.set ( Index, Index * 10 );
   for(int i=0; i<v.size(); i++)
     PR(v.get(i));
   
}
 
 
 
 
 

//demonsterar hur C-strängar skapas, pekararitmetik

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
 
void main () {
  dos_console();
  char Hello1[] = "Hello!";
  char * Hello2 = "Hello again!";
  char Hello3[5];
  char *copy  = Hello2; 
  *(Hello3 + 0) = 'H';
  *(Hello3 + 1) = 'e';
  *(Hello3 + 2) = 'j';
  *(Hello3 + 3) = '!';
  *(Hello3 + 4) = '\0';
 
   char *Hello4 = "OKEJ DÅ";
    
 
  for(int i = 0; copy[i];i++)  //copy[i] verkar fungerar
      cout << copy[i];
  cout << endl << endl;
  
  
  PR(Hello4);         //med makrot
 
  cout << Hello1 << ' ' << Hello2 << ' ' << Hello3 << endl;
}
 
 
 
 
 

//demonsterar hur C-strängar skapas, []-operatorn

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
 
#include <iostream>
 
void main () {
  char Hello1[] = "Hello!";       //tomma hakparenteser - kompilatorn
  char * Hello2 = "Hello again!"; //räknar själv ut längden. Pekare ger
  char Hello3[5];                 //samma sak
 
  Hello3[0] = 'H';
  Hello3[1] = 'e';
  Hello3[2] = 'j';
  Hello3[3] = '!';
  Hello3[4] = '\0'; //viktigt med nolltecken i slutet
 
  cout << Hello1 << ' ' << Hello2 << ' ' << Hello3 << endl;
}
 
 

//demonstrerar hur en fil öppnas och stängs i C

#include <iostream>
#include <stdio.h>
#include "iodos.h"
using namespace std;
 
  
  
 
 
 
void main () {
  char c;
 
  // läs tecken ända tills vi får ett EOF (end of file)
  while ( (c = getchar ()) != EOF ) {
         putchar ( c );
  }
}
 
 
 
 

//en enkel dynamisk vektorklass

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
class Vector {
public:
  // konstruktor och destruktor
  Vector (unsigned int Size) { m_Data = new int [Size]; m_Size = Size; }
  ~Vector () { }
  
  // accessmetoder
  void set (unsigned int Index, int Value) { m_Data[Index] = Value; }
  int get (unsigned int Index) const { return m_Data[Index]; }
 
  // storleken på vektorn
  unsigned int size () const { return m_Size; }
 
private:
  // pekare till datablock
  int * m_Data;
 
  // storlek på vektor
  unsigned int m_Size;
};
 
  
void main () {
 
  // skapa en dynamisk vektor med 100 element
  Vector V ( 100 );
 
  // fyll den med data
  for ( int Index = 0; Index < 100; Index++ ) {
         V.set ( Index, Index * 10 );
     
  }
  for(int i=0; i<V.size();i++)
      V.set(i,i*i);
  for(i=0; i<V.size();i++)
      cout << i << " " << V.get(i) << endl;
}

 

 

 

//kopierar en C-sträng med en funktion strncpy().

//Allokerar minne.
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
 
#include <iostream>
#include <string.h>
 
void main () {
  dos_console();
  char Hello1[50] = "Hej! Detta är en lååång sträng.";
  char * Hello2;
 
  // allokera minne
  Hello2 = new char [ strlen ( "Detta" ) + 1 ];
  
  // utför kopieringen 
  strncpy ( Hello2, Hello1, 5 );
  Hello2[5] = '\0';
  
  cout << "Hello1 = '" << Hello1 << "', " << endl
       << "Hello2 = '" << Hello2 << "'" << endl;
 
  delete [] Hello2;
}
 
 
 
 
 

//implementation av klassen 'Color'

#include <iostream>
#include "iodos.h"
using namespace std;
 
// definiera klasser 'Color'
class Color {
public:
  // konstruktor
  Color (float Red = 0.0, float Blue = 0.0, float Green = 0.0);
  Color (const Color & Original);
 
  // accessera de enskilda komponenterna
  float red () const { return m_Red; }
  float green () const { return m_Green; }
  float blue () const { return m_Blue; }
  void setRed (float Red) { m_Red = Red; }
  void setGreen (float Green) { m_Green = Green; }
  void setBlue (float Blue) { m_Blue = Blue; }
 
private:
  // de enskilda komponenterna
  float m_Red;  
  float m_Green;  
  float m_Blue;   
};
 
Color::Color (float Red, float Blue, float Green) {
  m_Red = Red;  
  m_Green= Green;
  m_Blue = Blue; 
}
 
Color::Color (const Color & Original) {
  m_Red = Original.red ();  
  m_Green= Original.green ();
  m_Blue = Original.blue (); 
}
 
 
void main () {
  // skapa några färger
  Color Red ( 1 );
  Color Grey ( 0.6, 0.6, 0.6 );
  Color White ( 1, 1, 1 );
}
 
 
  

 //jämför två C-strängar

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << "   ";
 
 
void jamfor(char *  s1, char *  s2)
    {
          PR(s1); PR(s2);
          if ( strcmp ( s1, s2  ) == 0 )
              cout << " (lika) " << endl;
         else
         cout << " (olika) " << endl;
     }
void main () {
  dos_console();
  char * s1 = "Hej!";
  char * s2 = "Hello world";
  char * s3 = "Hello world";
  char * s4 = "Sven";
  char * s5 = "Sven";
  // jämförelse
  jamfor(s1,s2);
  jamfor(s2,s2);
  jamfor(s4,s5);
  jamfor(s1,s5);
  jamfor(s3,s2);
  jamfor(s1,s1);
  jamfor(s5,s2);
}
 
 
 
 

//jämför två C-strängar

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
bool compare (const char * S1, const char * S2) {
  int i1 = 0;
  int i2 = 0;
 
  // säkerhet
  if(! S1 || ! S2)        // någondera (eller båda) strängarna odefinierade
         return false;
  
  while(S1[i1] != '\0' && S2[i2] != '\0') {
         // är tecknen ännu lika?
         if ( S1[i1++] != S2[i2++] )// nej, så strängarna är olika
                    return false;
  }
  return true;  // strängarna är lika
}
 
void main () {
  dos_console();
  char * S1 = "Hej!";
  char * S2 = "Hello world, this is main() calling";
  char * S3 = "Hello world, this is main() calling";
 
  // jämförelse
  if( compare (S1, S2) )  //om sant
         cout << "S1 och S2 är lika" << endl;
  else
         cout << "S1 och S2 är olika" << endl;
 
  if( compare ( S2, S3 ) )
         cout << "S2 och S3 är lika" << endl;
  else
         cout << "S2 och S3 är olika" << endl;
}
 
 
 
 

//classen coordinate

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
 
 
class Coordinate {
public:
  // konstruktorer
  Coordinate (float X, float Y) { m_X = X; m_Y = Y; };
  Coordinate (const Coordinate & Original) { m_X = Original.x (); m_Y = Original.y (); };
  Coordinate () { m_X = 0; m_Y = 0; };
 
  // accessera medlemmar
  float x () const { return m_X; };
  float y () const { return m_Y; };
  void setX (float X) { m_X = X; };
  void setY (float Y) { m_Y = Y; };
 
private:
  // medlemmar
  float m_X;
  float m_Y;
};
 
// skriv ut en koordinat
void printCoordinate (Coordinate C) {
  cout << "X = " << C.x () << ", Y= " << C.y () << endl;
}
 
 
void main () {
  Coordinate C1 ( 1, 2);
  Coordinate C2 ( C1 );
  Coordinate C3 = C1;
 
  // skriv ut de olika koordinaterna
  printCoordinate ( C1 );
  printCoordinate ( C2 );
  printCoordinate ( C3 );
 
  //eget med macro
  Coordinate Cor(25,35);
  PR(Cor.x()); PR(Cor.y()); 
}
 
 
 
 

//kopierar en C-sträng

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
  
void main () {
  dos_console();
  char Hello1[5] = "Hej!";
  char Hello2[5];
 
  // utför kopieringen teckenvis
  for ( int Index = 0; Index < 5; Index++ )
         Hello2[Index] = Hello1[Index];
 
  PR(Hello2);
 
  char s[] = "Kopiera på ett annat sätt";
  char s2[100]; //reservera tillräckligt med minne
  int i = strlen(s); //strlen beräknar längden utan nolltecken
  for(int k=0; k< i+1; k++)
       s2[k]=s[k] ;
   PR(s); PR(s2);
  
}
 
 
 
 
 
 
 

//konkatenerar en C-sträng  till en annan

#include <iostream>
#include "iodos.h"
#include <string.h>
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
void concat (char * Source, char * Destination) {
  // beräkna slutet på destinationssträngen
  unsigned int Start = strlen ( Destination );
  
  // iterera över och kopiera alla tecken
  for ( unsigned int Index = 0; Index <= strlen ( Source ); Index++ ) {
    // kopiera ett tecken
    Destination[Start + Index] = Source[Index];
  }
}
  
void main () {
  dos_console();
  char Destination[100] = "En exempelsträng";
  char Source [] = " och en annan";
   PR(Source); PR(Destination);
  // utför kopieringen 
  concat ( Source, Destination ); 
  cout << "Efter konkatenering" << endl;
  PR(Destination);
}
 
 
 
 
 
 

//jämför vissa tecken av två C-strängar

#include <iostream>
#include "iodos.h"
#include <stdlib.h>
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
 
 
void main () {
  char * S1 = "Hello world";
  char * S2;
 
  // utför kopieringen
  S2 = strdup ( S1 );
 
  cout << "S1 = '" << S1 << "', " << endl
       << "S2 = '" << S2 << "'" << endl;
 
  // frigör strängen med C:s funktion free()
  free ( S2 );
}
 
 
 
 
 
 
 

//kopierar en C-sträng

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
 
 
 
void copy (char * Source, char * Destination) {
  // iterera över och kopiera alla tecken
     for (int i = 0; i <= strlen (Source); i++ ) {
         // kopiera ett tecken
         Destination[i] = Source[i];
 
  } 
//ALTERNATIVT
//  while(*Source)
//      * Destination++ = *Source++;     
//      *Destination = '\0'; //lägger till nolltecknet eller ett varv till
                          //  Destination++ = *Source++;
 
 } 
 
 
void main () {
  dos_console();
  char char_fran[] = "Detta är ett copyprov ";
  char char_till[100]; //var noga med att dett finns reserverat tillräckligt
                    //med minne - annars violation
  // utför kopieringen 
  copy (char_fran, char_till);
 
  PR(char_fran); 
  cout << " till ";
  PR(char_till);
}
 
 
 

//skriver ut tal till en fil i binär form

#include <fstream>
#include <stdlib.h>
#include "iodos.h"
using namespace std;
 
void main () {
  // öppna filen
  ofstream Out ( "Test.bin");
  char c[30] = "Test av att skriva till fil";
  // kunde filen öppnas?
  if ( ! Out ) {
    // kunde inte öppna filen!
    cout << "Kunde inte öppna filen 'Test.bin'!" << endl;
    exit ( EXIT_FAILURE );
  }
 
  // skriv ut 10 tal till filen
  for ( int Index = 0; Index < 10; Index++ ) {
    // skriv ut talet binärt
     
    Out.write ( c , sizeof(int) );
  }
}
 
 
 
 
 

//söker i en sträng

#include <iostream>
#include "iodos.h"
#include <stdlib.h>
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
 
 
int findChar (char * String, char find) {
  int i= 0;
  
  // iterera tills vi kommer till slutet
  while ( String[i] != '\0' ) {
         // är det korrekt tecken?
         if ( String[i] == find ) {
           // vi har korrekt index
           return i;
         }
 
         i++;
  }
 
  // inget index hittades
  return -1;
}
 
void main () {
    dos_console();
  int Index;
  char * s = "En sträng ur vilken vi söker text";
 
  cout << "Söksträngen är: '" << s << "'" << endl;
  
  // sök ett 'v'
  if ( ( Index = findChar (s, 'v' )) != -1 ) {
         cout << "Hittade ett 'v' på index " << Index << endl;
  }
  else {
         cout << "Hittade inget 'v'" << endl;
  }
 
  // sök ett 'P'
  if ( ( Index = findChar (s, 'P' )) != -1 ) {
         cout << "Hittade ett 'P' på index " << Index << endl;
  }
  else {
         cout << "Hittade inget 'P'" << endl;
  }
}
 
 
 
 

//söker ett tecken ur en sträng med index()

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << "   ";
 
//tveksamt om detta är rätt - index funktionen saknas
char * index(char *c, char find)
    {
    char *found;
    found =  c;
    for(int i =0; i <= strlen(c); i++)
        {  
        *found++;
        if(c[i] == find)
        return  found;
        }
        return '\0';
    }
void main () {
  dos_console();
  char * Found;
  char * S = "En sträng ur vilken vi söker text";
 
  cout << "Söksträngen är: '" << S << "'" << endl;
  
  // sök ett 'v'
  if ( ( Found = index (S, 'v' )) != 0 ) {
         cout << "Hittade ett 'v' på index " << Found - S << endl;
  }
  else {
         cout << "Hittade inget 'v'" << endl;
  }
 
 
  // sök ett 'x'
  if ( ( Found = index (S, 'x' )) != 0 ) {
         cout << "Hittade ett 'x' på index " << Found - S << endl;
  }
  else {
         cout << "Hittade inget 'v'" << endl;
  }
 
 
  // sök ett 'P'
  if ( ( Found = index (S, 'P' )) != 0 ) {
         cout << "Hittade ett 'P' på index " << Found - S << endl;
  }
  else {
    cout << "Hittade inget 'P'" << endl;
  }
}
 
 
 
 

//testar makron med hjälp av preprocessorn

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#define KVADRAT(X) cout <<"Kvadraten på "<<X<<"*"<<X<<" = "<<((X)*(X))<< endl;
#define MAX(X,Y) cout<<X<<" och "<<Y <<" = " <<(X > Y ? X : Y)<< " är större" << endl;
 
 
 
 
#undef FOO
 
#ifdef FOO
#error "1"
#else
 
#endif
 
void main () {
  dos_console();
  int a=23, b = 56;
  KVADRAT(a);
  MAX(a,b);
}
 
 
 
 
 

//visar en enkel klass samt hur data definieras som privat

#include <iostream>
#include "iodos.h"
using namespace std;
 
 
class Coordinate {
public:
  // konstruktorer
  Coordinate (float X, float Y) { m_X = X; m_Y = Y; };
  Coordinate (int X, int Y) { m_X = X; m_Y = Y; };
  Coordinate () { m_X = 0; m_Y = 0; };
 
  // accessera medlemmar
  float x () { return m_X; };
  float y () { return m_Y; };
  void setX (float X) { m_X = X; };
  void setY (float Y) { m_Y = Y; };
 
private:
  // medlemmar
  float m_X;
  float m_Y;
};
 
void main () {
 
  Coordinate C = Coordinate ( 1, 2);
  cout << C.x () << "  "<< C.y () << endl;
  C.setX (100);
  C.setY (200);
  cout << C.x () << "  "<< C.y () << endl;
 
}
 
 
 
 
 
 
 
 

 //öppna fil för läsning

#include <iostream>
 
#include "iodos.h"
using namespace std;
 
  
 
  if ( (Source = fopen (argv[1], "r" )) == 0 ) {
    // kunde inte öppna filen
    printf ("Kunde inte öppna filen '%s'\n", argv[1] );
    exit (EXIT_FAILURE);
  }
  
  // öppna fil för skrivning
  if ( (Destination = fopen (argv[2], "w" )) == 0 ) {
    // kunde inte öppna filen
    printf ("Kunde inte öppna filen '%s'\n", argv[2] );
    exit (EXIT_FAILURE);
  }
  
  // läs tecken ända tills vi får ett EOF (end of file)
  while ( (c = fgetc ( Source )) != EOF ) {
    fputc ( c, Destination );
  }
 
  // stäng alla filer
  fclose ( Source );
  fclose ( Destination );
}
 
 
 
 

//en enkel dynamisk vektorklass

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
 
class Vector {
public:
  // konstruktor och destruktor
  Vector (unsigned int Size) { m_Data = new int [Size]; m_Size = Size; }
  Vector (const Vector & Original) {
    // allokera minne
    m_Size = Original.size ();
    m_Data = new int [ m_Size ];
 
    // kopiera minnet
    memcpy ( m_Data, Original.m_Data, sizeof(int) * m_Size );
  }
  ~Vector () { delete [] m_Data; }
  
  // accessmetoder
  void set (unsigned int Index, int Value) { m_Data[Index] = Value; }
  int get (unsigned int Index) const { return m_Data[Index]; }
 
  // storleken på vektorn
  unsigned int size () const { return m_Size; }
 
private:
  // pekare till datablock
  int * m_Data;
 
  // storlek på vektor
  unsigned int m_Size;
};
 
  
void main () {
 
  // skapa en dynamisk vektor med 10 element
  Vector v (10);
  int a=1;
  
  for(int i=0; i<v.size();i++)
      {
      v.set(i,a*a);
      a++;
      }
   // skapa en kopia
  Vector Destination(v);
  for(i=0;i<v.size();i++)
      PR(Destination.get(i));
}
 
 
 
 

//program som anropar en funktion rekursivt och beräknar n! (n-fakultet)

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
  
 
unsigned int Fakultet (unsigned int n) {
  if ( n == 0 ) {
    // basfallet nått
    return 1;
  }
  PR(n);
  return n * Fakultet (n- 1);
}
 
void main () {
  unsigned int Tal;
 
  cout << "Ge in ett tal: ";
  cin >> Tal;
 
  // beräkna fakulteten och skriv ut svaret
  cout << Tal << "! = " << Fakultet (Tal) << endl;
}
 
 
 
 
 

//program som anropar en funktion rekursivt och beräknar ett

//Fibonacci-värde
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
  
 
 
unsigned int fib (unsigned int n) {
  if ( n == 0 ) {
    // basfall 1 nått
    return 0;
  }
 
  if ( n == 1 ) {
    // basfall 2 nått
    return 1; 
  }
  
  // allmänt fall, använd rekursion
  return fib(n - 1) + fib(n - 2);
}
 
void main () {
  unsigned int Tal;
  cout << "Ge in ett tal: ";
  cin >> Tal;
 
  // beräkna fakulteten och skriv ut svaret
  cout << "fib(" << Tal << ") = " << fib ( Tal ) << endl;
}
 
 
 
 
 
 

//funktion som dubblerar ett tal

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iomanip>  
//! visar hur funktioner kan användas som parametrar
 
 
int dubblera(int Tal) {
  return Tal + Tal;
}
 
// funktion som kvadrerar att tal
int kvadrera(int Tal) {
  return Tal * Tal;
}
 
// funktion som applicerar en given funktion på en serie med tal
void applicera (int (*funktion)(int) ) {
  // iterera över talen 0 till 4
  for (int i = 0; i <= 4; i++ ) {
    // applicera den givna funktionen på talet
    cout << "Tal: " << setw(3) << i << " blir: "
         << setw(4) << funktion(i) << endl;
  }
}
 
void main () {
 
  cout << "Funktion: dubblera" << endl;
  
  // anropa applicera() med funktionen dubblera()
  applicera(dubblera);
 
  cout << endl << "Funktion: kvadrera" << endl;
 
  // anropa applicera() med funktionen kvadrera()
  applicera (kvadrera);
}
 
 
 

//läser en given fil rad för rad och räknar antalet rader

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
#include <fstream>
#include <stdlib.h>
 
void main (int argc, char * argv[]) {
   dos_console();
    int Antal = 0;
  char Buffer [250];
         char Newline;
  
  // har vi tillräckligt parametrar?
  if ( argc != 2 ) {
    cout << "Fel antal parametrar!" << endl;
    cout << "Användning: " << argv[0] << " filnamn" << endl;
    exit ( EXIT_FAILURE );
  }
 
  // öppna en fil
  ifstream Data ( argv[1] );
  if ( ! Data ) {
    // kunde inte öppna filen
    cout << "Kunde inte öppna filen: " << argv[1] << endl;
    exit ( EXIT_FAILURE );
  }
 
  // läs rad för rad
  while ( Data.get ( Buffer, 250 ) ) {
         // läs det '\n' som finns
         Data.get (Newline);
         
         // öka antalet lästa rader
         Antal++;
  }
 
  // skriv ett svar
  cout << "Läste " << Antal << " rader." << endl;
}
 
 
 
 
 

//läser in ett tecken från tangentbordet

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iomanip>
 
 
 
 
void main () {
 
  char Tecken;
 
  // upprepa slingan ända tills användaren ger in tecknet 'q'
  do {
         // läs in ett tecken
         cout << "Ge ett tecken: ";
         cin >> Tecken;
 
    //cin.get(Tecken); tar med blank tecken
         //       cin >> noskipws >> Tecken;
         cout << "Du gav in tecknet '" << Tecken << "'." << endl;
  }
  while ( Tecken != 'q' );
}
 
 
 
 
 

//läser in ett heltal, ett flyttal och en sträng från tangentbordet

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
 
 
 
void main () {
 
  int Tal;
  float Flyttal;
  string Text;
 
  // läs ett tal
  cout << "Ge ett heltal: " << flush;
  cin >> Tal;
  
  // läs ett decimaltal
  cout << "Ge ett decimaltal: " << flush;
  cin >> Flyttal >> Flyttal;
  
  // läs en sträng
  cout << "Ge en sträng: " << flush;
  cin >> Text;
 
  cout << "Du gav värdena '"
            << Tal << "', '"
            << Flyttal << "', '"
            << Text << "'." << endl;
}
 
 
 
 
 
 

//läser ett heltal och hanterar felsituationer

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
 
 
 
 
void main () {
  int Tal;
  string Dummy;
 
  // iterera evigt
  while ( true ) {
    // läs ett tal
    cout << "Ge ett heltal: " << flush;
 
         // läs ett tal
    if ( ! (cin >> Tal) ) {
      // illegalt tal
      cout << "Illegalt heltal!" << endl;
 
      // nollställ felindikatorn för cin
      cin.clear ();
 
      // läs bort resten av raden och ignorera denna
      getline ( cin, Dummy );
    }
    else {
      // talet är ok
      cout << Tal << " är ett ok heltal!" << endl;
    }
  }
}
 
 
 
 
 

 

//Hello World med hjälp av namespaces

#include <iostream>
 
void main () {
  int Ar;
  
  // läs in ett år
  //std::cout std måste skrivas ut namespace
  std::cout << "Skriv ett år: ";
  std::cin >> Ar;
 
  // skriv vår hälsning
  std::cout << "Hello world, detta är år " << Ar << std::endl;
}
 
 
 
 
 

//visar hur ett program som använder namespaces med flera kalsser i

#include "iodos.h"
 
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
  
 
#include <vector>
 
// definiera ett nytt namespace
namespace math {
 
  // en matematisk vektor
  class vector {
  public:
    vector () {};
  };
 
  // en matematisk matris
  class matrix {
  public:
    matrix (int X, int Y) : m_X(X), m_Y(Y) {};
  private:
    int m_X, m_Y;
  };
}
 
void main () {
  // skapa en vektor av vektorer
  std::vector<math::vector> VektorContainer;
 
  // skapa en matrix
  math::matrix M ( 3, 3 );
}
 
 
 
 

//class product

#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
  
#include <iostream>
#include <string>
 
class Product {
public: 
  // konstruktor
  Product (const string & Name, int Id) { m_Name = Name, m_Id = Id; }
  ~Product(){}
  // skriv ut produkten på skärmen
  void print () const;
 
private:
  string m_Name;
  int    m_Id;
};
 
void Product::print () const { 
  cout << "Produktnamn: " << m_Name << ", id: " << m_Id << endl;
}
 
void main () {
 
  Product * Lager [10]; //pekare av Product
  int Id = 0;
  string Names [10] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
   
  // skapa nya produkter
  for ( int Index = 0; Index < 10; Index++ ) {
         Lager[Index] = new Product ( Names[Index], Id++ );
  }
 
  // skriv ut vårt lager
  for (Index = 0; Index < 10; Index++ ) {
         Lager[Index]->print ();
    
  }
}
 
 
 
 
 

//class product2

#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iostream>
#include <string>
 
 
class Product {
public: 
  // konstruktor
  Product (const string & Name);
 
  // skriv ut produkten på skärmen
  void print () const;
 
private:
  // en statisk variabel
  static int m_NextId;
  
  // normala medlemmar
  string m_Name;
  int    m_Id;
};
 
Product::Product (const string & Name) {
  m_Name = Name;
  m_Id = m_NextId++;
}
 
// initialisera vår statiska variabel
int Product::m_NextId = 0;
 
void Product::print () const { 
  cout << "Produktnamn: " << m_Name << ", id: " << m_Id << endl;
}
 
void main () {
  Product * Lager [10];
  string Names [10] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
   
  // skapa nya produkter
  for ( int Index = 0; Index < 10; Index++ ) {
         Lager[Index] = new Product ( Names[Index] );
  }
 
  // skriv ut vårt lager
  for (Index = 0; Index < 10; Index++ ) {
         Lager[Index]->print ();
  }
}
 
 
 
 

//class product3

#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iostream>
 
 
void main () {
   dos_console();
   int Tal = 256 ;
   cout << "Rotering 1 varv åt höger = dividera med 2" << endl;
   //division med 2
   PR(Tal);
   PR((Tal >> 1));
   PR((Tal >> 2));
   PR((Tal >> 3));
   PR((Tal >> 4));
   PR((Tal >> 5));
   PR((Tal >> 6));
   PR((Tal >> 7));
   PR((Tal >> 8));
   cout << endl << "Rotering 1 varv åt vänster = multiplicera med 2" << endl;
   //multiplikation med 2
   Tal = 1;
   PR(Tal);
   PR((Tal << 1));
   PR((Tal << 2));
   PR((Tal << 3));
   PR((Tal << 4));
   PR((Tal << 5));
   PR((Tal << 6));
   PR((Tal << 7));
   PR((Tal << 8));
}
 
 
 
 

//kontrollerar om en given sträng kan vara ett giltigt soccialskyddssignum

#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iostream>
#include <string>
#include <ctype.h>
#include <stdlib.h>
 
bool okSignum (const string & Data) {
  // är längde ok?
  if ( Data.length () != 11 ) 
         // kan inte vara ett signum
         return false;
  
  // först skall vi ha 6 siffror
  for ( int Index = 0; Index < 6; Index++ ) {
         if ( ! isdigit ( Data[Index] ) ) {
           // ingen siffra
           return false;
         }
  }
 
  // nästa skall vara ett '-'
  if ( Data[6] != '-' )
    // inget '-'
    return false;
  
  // sedan 4 alfanumeriska tecken
  for (Index = 7; Index < 11; Index++ ) {
    if ( ! isalnum ( Data[Index] ) ) {
      // ingen siffra
      return false;
    }
  }
 
  // det kan vara ett signum
  return true;
}
 
int main (int argc, char * argv[]) {
  // verifiera antal parametrar
  if ( argc != 2 ) {
    cout << "Fel antal parametrar!" << endl;
    cout << "Användning: " << argv[0] << " signum" << endl;
    return EXIT_FAILURE;
  }
  
  string Signum = argv[1];
 
  // kolla ifall det är ett signum
  if ( okSignum ( Signum ) ) {
    cout << Signum << " kan vara ett giltigt socialskyddssignum." << endl;
  }
  else {
    cout << Signum << " är inte ett giltigt socialskyddssignum." << endl;
  }
}
 
 
 
 

//använder en iterator för att skriva ut tecknen i en sträng

#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
 
 
#include <iostream>
#include <string>
 
 
void reverse();   
    
void main () {
   dos_console();
   string S = "Hello";
 
   // iterator till strängens tecken
   string::iterator It = S.begin ();
   
   // skriv ut alla tecken genom att iterera över dem
   for ( ; It != S.end (); It++ ) {
          cout << *It << endl;
   }
   reverse();
 
 
  //olika utskriftsmöjligheter
  string Original = "Hello world  This is Levi calling";
  string S1 = Original;
  string S2 (10, 'A'); //skriver 10 A
  string S3 (Original, 6, 5); //skriver 5 tecken med början från 6
  string S4 (Original.begin (), Original.end ());
  
  cout << S1 << endl;
  cout << S2 << endl;
  cout << S3 << endl;
  cout << S4 << endl;
 
  //! testar access till tecken i strängar m.h.a. []
  // ändra 'w' till 'W'
  S1 [6] = 'W'; //ändrar från liten till stor bokstav
  S1 [23] = S1[6];
  PR(S1);
 
  // ändra 'W' till 'w' med .at
  S1.at (23) = 'w';
  PR(S1);
   
  
  // ändra 'w' till 'W'
  try {
         S1.at (100) = 'W';
  }
  catch (...) {
         cout << "Error" << endl;   //exception
 
  }
 
 
}
 
  
 
 
 void reverse(){    
   string S = "Detta är en text";
   // iterator till strängens tecken
   string::reverse_iterator It = S.rbegin ();
 
   // skriv ut alla tecken genom att iterera över dem
   for ( ; It != S.rend (); It++ )  
          cout << *It ;
   cout << endl;
       }
 
 
 
 

//testar jämförelse av strängar

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
 
//! testar addering av strängar med operatorn +
string konkatenera(const string &, const string &);
 
//! testar konkatenering av strängar med +=
string konkatenera2(const string &, const string & );  
 
  
 
void main () {
  dos_console();
  string S1 = "abc";
  string S2 = "ABC";
  string S3 = "Hej";
  
  if ( S1 < S1 )
         cout << S1 << " är mindre än " << S2 << endl;
  else
         cout << S1 << " är större än " << S2 << endl;
 
  if ( S2 < S3 )
         cout << S2 << " är mindre än " << S3 << endl;
  else
         cout << S2 << " är större än " << S3 << endl;
 
  cout << "NYTT EXEMPEL" << endl << endl;
  
  string Namn = konkatenera( "Sven Erik ", "Persson" );
  string Text = "Fullständigt namn: " + Namn;
  PR(Text);
   
   cout << "EXEMPEL 2" << endl << endl;
   Namn = konkatenera2("Per", "Adamsson");
   PR(Namn);
}
 
 
 

//testar addering av strängar med operatorn +

string konkatenera(const string & Fornamn, const string & Efternamn) {
 
  // ge tillbaka det fullständiga namnet
  return Fornamn + " " + Efternamn;
}
 
 

//testar konkatenering av strängar med +=

string konkatenera2(const string & Fornamn, const string & Efternamn) {
  string Namn = Fornamn;
  Namn += ' ';
  Namn += Efternamn;
 
  // ge tillbaka det fullständiga namnet
  return Namn;
}
 
 
 

//testar radering av text i en sträng

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
 
 
void main () {
  string Text = "The Lord of the Rings";
 
  Text.erase ( 0, 4 ); //tar bort 4 tecken med början från 0
 
  cout << Text << endl;
 
 
 
  Text = "The Lord of the Rings";
  string S = "ABCL";
  
  string::size_type i1 = Text.find_first_of ( 'e' );   // I1 == 2
  string::size_type I2 = Text.find_first_of ( " or" ); // I2 == 3
  string::size_type I3 = Text.find_first_of ( S );     // I3 == 4
 
  PR(i1); PR(I2); PR(I3);
}
 
 
 
 

//testar sökning av tecken i en sträng

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
 
 
void main () {
  string Text = "The Lord of the Rings";
  string S = "ABCL";
 
    cout << Text.find_first_not_of ( "The" ) << endl;
    cout << Text.find_first_not_of ( "the" ) << endl;
    cout << Text.find_last_not_of ( "Rings" ) << endl;
    cout << Text.find_last_not_of ( "abc" ) << endl;
  
  string::size_type I1 = Text.find_first_not_of ( "The" );  // I1 == 3
  string::size_type I2 = Text.find_first_not_of ( "the" );  // I2 == 0
  string::size_type I3 = Text.find_last_not_of ( "Rings" ); // I3 == 15
  string::size_type I4 = Text.find_last_not_of ( "abc" );   // I4 == 20
 
   
  
}
 
 

//testar sökning av substrängar

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
 
 
void main () {
  string Text = "The Lord of the Rings";
 
  if ( Text.find ( "lord" ) != string::npos )
         cout << "Hittade" << endl;
  else
         cout << "Hittade ej" << endl;
}
 
 

//visar hur strängars längd kan fås med length() och size()

#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
 
void main () {
  string S1 = "Hello world";
  string S2;
  
  // skriv ut strängens längd
  cout << "size()   : " << S1.size () << endl;
  cout << "length() : " << S1.length () << endl;
 
 
 //! testar ersättning av text i en sträng
  string Text = "The Lord of the Rings";
 
  Text.replace ( Text.find ( "Lord"), 4, "lord" );
 
  cout << Text << endl;
 
}
 
 
  

//struct product

#include <iostream>
#include "iodos.h"
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
using namespace std;
 
struct Produkt {
  string Namn;
  float  Pris;
  int    Antal;
};
 
void nyProdukt (Produkt & P) {
  // läs in data i produktens medlemmar
  cout << "Namn : ";
  cin >> P.Namn;
  cout << "Pris : ";
  cin >> P.Pris;
  cout << "Antal: ";
  cin >> P.Antal;
}
 
void skrivUt (Produkt * P) {
  // skriv ut info om produkten
  cout << endl;
  cout << "Information om produkt: " << endl;
  cout << "  namn:  " << P->Namn << endl;
  cout << "  pris:  " << (*P).Pris << endl; //samma som P->Pris
  cout << "  antal: " << P->Antal << endl;
}
 
void main () {
    dos_console();
  Produkt Ny;
 
  // läs in en produkt
  nyProdukt ( Ny );
 
  // skriv ut på skärmen
  skrivUt ( &Ny );
 
}
 
 

//testar substrängar av en sträng

#include <iostream>
#include "iodos.h"
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
using namespace std;
 
void main () {
  string Text = "The Lord of the Rings";
 
  string Sub1 = Text.substr ( 16 );
  string Sub2 = Text.substr ( 9, 2 );
  
 
  PR(Sub1); PR(Sub2);
   
}